home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / Games / xmris / timer.c < prev    next >
C/C++ Source or Header  |  1995-05-03  |  3KB  |  141 lines

  1. /*{{{  (C) 1992 Nathan Sidwell*/
  2. /*****************************************************************************
  3.             X M R I S V1.01
  4.             ---------------
  5.             (C) 1992 Nathan Sidwell
  6.  
  7. This program is copyright (C) 1992 Nathan Sidwell. This software and documentation
  8. is in the public domain. Permission is granted to distribute and compile
  9. verbatim copies of this software for non-commercial, non-profit use,
  10. without fee. The software may be modified, provided that both the above copyright
  11. notice and this permission notice appear.
  12.  
  13. No guarantee is given as to the robustness or suitability of this
  14. software for your computer.
  15.  
  16. Nathan Sidwell  INMOS UK |                 | nathan@inmos.co.uk       DoD#0390
  17. *****************************************************************************/
  18. /*}}}*/
  19. #include "xmris.h"
  20. #include <time.h>
  21. #include <sys/time.h>
  22. #include <signal.h>
  23. /*{{{  timer*/
  24. static struct
  25. {
  26.   void      (*handler)();   /* original handler */
  27.   unsigned  mask;           /* previous signal mask */
  28.   unsigned  volatile counter;        /* timer counter */
  29.   struct itimerval interval; /* interval time */
  30. } timer;
  31. /*}}}*/
  32. /*{{{  prototypes*/
  33. static void timer_alarm PROTOARGLIST((int));
  34. /*}}}*/
  35. /*{{{  void timer_alarm(sig)*/
  36. static void timer_alarm FUNCARGLIST((sig))
  37. int       sig FUNCARGTERM
  38. {
  39.   timer.counter = 1;
  40.   signal(SIGALRM, timer_alarm);
  41.   return;
  42. }
  43. /*}}}*/
  44. /*{{{  void timer_close()*/
  45. extern void timer_close FUNCARGVOID
  46. /*
  47.  * closes the timer stuff
  48.  */
  49. {
  50.   signal(SIGALRM, timer.handler);
  51.   return;
  52. }
  53. /*}}}*/
  54. /*{{{  void timer_open()*/
  55. extern void timer_open FUNCARGVOID
  56. /*
  57.  * initialize the timer stuff
  58.  * this means installing the alarm signam handler
  59.  */
  60. {
  61.   timer.interval.it_interval.tv_sec = 0;
  62.   timer.interval.it_interval.tv_usec = 0;
  63.   timer.interval.it_value.tv_sec = 0;
  64.   timer.interval.it_value.tv_usec = 0;
  65.   timer.handler = signal(SIGALRM, timer_alarm);
  66.   return;
  67. }
  68. /*}}}*/
  69. /*{{{  void timer_start(tick)*/
  70. extern void timer_start FUNCARGLIST((tick))
  71. unsigned  long tick FUNCARGTERM
  72. /*
  73.  * starts an interval timer
  74.  * which ticks every n microseconds
  75.  */
  76. {
  77.   timer.interval.it_value.tv_usec = tick;
  78.   timer.counter = 1;
  79.   timer_wait();
  80.   return;
  81. }
  82. /*}}}*/
  83. /*{{{  void timer_stop()*/
  84. extern void timer_stop FUNCARGVOID
  85. /*
  86.  * stops the interval timer
  87.  */
  88. {
  89.   timer.interval.it_value.tv_usec = 0;
  90.   timer_wait();
  91.   XDrawLine(display.display, display.window, GCN(GC_BALL),
  92.       WINDOW_WIDTH - global.missed, WINDOW_HEIGHT - 1,
  93.       WINDOW_WIDTH, WINDOW_HEIGHT - 1);
  94.   global.missed = 0;
  95.   return;
  96. }
  97. /*}}}*/
  98. /*{{{  void timer_wait()*/
  99. extern void timer_wait FUNCARGVOID
  100. /*
  101.  * waits for the next timer interrupt
  102.  * if this has already gone by, then we immediatley return
  103.  */
  104. {
  105.   if(!timer.counter)
  106.     {
  107.       int     mask;
  108.       
  109. #ifdef sco
  110.       sighold(SIGALRM);
  111. #else /*sco*/
  112.       mask = sigblock(sigmask(SIGALRM));
  113. #endif /*sco*/
  114.       if(!timer.counter)
  115.     {
  116.       if(global.missed)
  117.         {
  118.           XDrawPoint(display.display, display.window, GCN(GC_BALL),
  119.           WINDOW_WIDTH - global.missed, WINDOW_HEIGHT - 1);
  120.           global.missed--;
  121.         }
  122.       sigpause(0);
  123.     }
  124. #ifdef sco
  125.       sigrelse(SIGALRM);
  126. #else /*sco*/
  127.       sigsetmask(mask);
  128. #endif /*sco*/
  129.     }
  130.   else if(global.missed < WINDOW_WIDTH)
  131.     {
  132.       global.missed++;
  133.       XDrawPoint(display.display, display.window, GCN(GC_BALL),
  134.       WINDOW_WIDTH - global.missed, WINDOW_HEIGHT - 1);
  135.     }
  136.   timer.counter = 0;
  137.   setitimer(ITIMER_REAL, &timer.interval, (struct itimerval *)NULL);
  138.   return;
  139. }
  140. /*}}}*/
  141.